package com.haowu.auth.controller;

import com.alibaba.fastjson.JSONObject;
import com.haowu.auth.form.LoginBody;
import com.haowu.auth.form.SmsLoginBody;
import com.haowu.auth.form.WechatLoginBody;
import com.haowu.auth.service.CusLoginService;
import com.haowu.common.core.constant.Constants;
import com.haowu.common.core.domain.R;
import com.haowu.common.wx.domain.WxLoginBody;
import com.haowu.common.wx.utils.WxUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotBlank;
import java.util.HashMap;
import java.util.Map;

/**
 * token 控制
 *
 * @author Lion Li
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/customer")
public class CusLoginController {

    private final CusLoginService cusLoginService;

    /**
     * 登录方法
     */
    @PostMapping("login")
    public R<Map<String, Object>> login(@Validated @RequestBody LoginBody form) {
        // 用户登录
        String accessToken = cusLoginService.login(form.getUsername(), form.getPassword());
        // 接口返回信息
        Map<String, Object> rspMap = new HashMap<>();
        rspMap.put(Constants.ACCESS_TOKEN, accessToken);
        return R.ok(rspMap);
    }

    /**
     * 短信登录
     *
     * @param smsLoginBody 登录信息
     * @return 结果
     */
    @PostMapping("/smsLogin")
    public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = cusLoginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
        ajax.put(Constants.ACCESS_TOKEN, token);
        return R.ok(ajax);
    }

    /**
     * 小程序登录(示例)
     * 1.前台wx.login获取登录code
     * 2.前台根据code调用/getWxInfoByCode接口获取sessionKey与openid
     * 3.前台再次调用wx.getPhonenumber获取用户授权手机号
     * 4.后台根据前台传来的openid、unionid、手机号共同查询并登录,如果未查询到则创建新账号
     * @param wechatLoginBody 小程序登录传参
     * @return 结果
     */
    @PostMapping("/xcxLogin")
    public R<Map<String, Object>> xcxLogin(@Validated @RequestBody WechatLoginBody wechatLoginBody) {
        Map<String, Object> ajax = new HashMap<>();
        // 生成令牌
        String token = cusLoginService.xcxLogin(wechatLoginBody);
        ajax.put(Constants.ACCESS_TOKEN, token);
        return R.ok(ajax);
    }

    /**
     * 根据wx.login获取的code查询出sessionKey与openid
     * @param code wx.login获取的code
     * @return 登录凭证
     */
    @GetMapping("/getWxInfoByCode")
    public R<Map<String, String>> getWxInfoByCode(String code) {
        // 用户非敏感信息：rawData
        // 签名：signature
        // 1.接收小程序发送的code
        // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code
        // 3.接收微信接口服务 获取返回的参数
        WxLoginBody wxLoginBody = WxUtils.getSessionKeyAndOpenId(code);
        String sessionkey = wxLoginBody.getSessionKey();
        String openid = wxLoginBody.getOpenid();
        String unionid = wxLoginBody.getUnionid();
        Map<String, String> resultMap = new HashMap<>();
        resultMap.put("sessionkey", sessionkey);
        resultMap.put("openid", openid);
        resultMap.put("unionid", unionid);
        return R.ok(resultMap);
    }

    /**
     * 登出方法
     */
    @DeleteMapping("logout")
    public R<Void> logout() {
        cusLoginService.logout();
        return R.ok();
    }

}
